import $config from '../../../utils/config/config'
/** ——————————角色—————————— */
/**
 * 权限数据加入缓存
 * @param {Array|Object} param 权限数组或权限对象
 */
function initRole(param){
	init(param, $config.roleCacheKey);
}

/**
 * 从缓存中获取权限存放在页面Data中
 * <p>
 * 		页面使用方法：<button wx:if="{{hasRole['admin']}}">按钮(管理员)</button>
 * </p>
 * @param {Object} page 页面的作用域(this)
 */
function loadRole(page) {
	load(page, $config.roleCacheKey, $config.rolePageDataKey);
}

/** ——————————权限—————————— */
/**
 * 权限数据加入缓存
 * @param {Array|Object} param 权限数组或权限对象
 */
function initPermission(param){
	init(param, $config.permissionCacheKey);
}

/**
 * 从缓存中获取权限存放在页面Data中
 * <p>
 * 		页面使用方法：<button wx:if="{{hasPermission['sys:user:list']}}">按钮 sys:user:list</button>
 * </p>
 * @param {Object} page 页面的作用域(this)
 */
function loadPermission(page) {
	load(page, $config.permissionCacheKey, $config.permissionPageDataKey);
}

/**
 * 初始化（数据加入缓存）
 * @param {Array|Object} param 数据(数组或对象)
 * @param {String} cacheKey 缓存Key
 */
function init(param, cacheKey){
	var o1 = param;
	// 为空
	if (!o1) {
		throw new Error("传入参数为空!");
	}
	// 识别类型
	var gettype = Object.prototype.toString;
	if (!(gettype.call(o1) == '[object Array]' || gettype.call(o1) == '[object Object]')) {
		throw new Error("无效参数类型!");
	}
	// o1是数组 => 转为对象
	// 由于小程序页面中无法使用JS函数，所以使用key-value数据结构来解决这种尴尬
	if (gettype.call(o1) == '[object Array]') {
		let o1Obj = {};
		o1.for
		for (const index in o1) {
			o1Obj[o1[index]] = index;
		}
		o1 = o1Obj;
	}
  // 用户权限存入本地缓存
  wx.setStorageSync(cacheKey, o1);
}

/**
 * 从缓存中获取权限存放在页面Data中
 * <p>
 * 		页面使用方法：<button wx:if="{{hasPermission['sys:user:list']}}">按钮 sys:user:list</button>
 * </p>
 * @param {Object} page 页面的作用域(this)
 * @param {String} cacheKey 缓存Key
 * @param {String} pageDataKey 页面的作用域中Data的Key
 */
function load(page, cacheKey, pageDataKey) {
	var o1 = wx.getStorageSync(cacheKey);
	// 为空
	if (!o1) {
		throw new Error("权限缓存为空!（key:"+ cacheKey +"）");
	}
	// 识别类型
	var gettype = Object.prototype.toString;
	if (!gettype.call(o1) == '[object Object]') {
		throw new Error("无效类型!");
	}
	// hasPerm存入页面中
	page.setData({
		[pageDataKey]: o1
	})
}

/**
 * 验证角色(JS中调用)
 * @param {String} role 验证的角色
 * @returns {Boolean} isRole 是否拥有该角色
 */
function hasRole(role) {
	var isRole = false;
	var roles = wx.getStorageSync($config.roleCacheKey);
	if(roles[role]){
		isRole = true;
	}
	return isRole;
}

export default {
	initPermission,
	loadPermission,
	initRole,
	loadRole,
	hasRole,
}